package com.powernode.dataservice.service;

import com.alibaba.fastjson.JSONObject;
import com.powernode.api.model.ProductInfo;
import com.powernode.api.pojo.ProductData;
import com.powernode.api.service.ProductInfoService;
import com.powernode.constants.RedisKey;
import com.powernode.constants.YLBConstants;
import com.powernode.dataservice.mapper.ProductInfoMapper;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.util.concurrent.TimeUnit;

@DubboService(interfaceClass = ProductInfoService.class,version = "1.0.0")
public class ProductInfoServiceImpl implements ProductInfoService {

    @Autowired
    private ProductInfoMapper productInfoMapper;


    /*注入 redisTemplate*/

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 获取三个集合  分页  0，3  根据类型
     * @return
     */
    @Override
    public synchronized ProductData queryIndexProductList() {
        ProductData productData = new ProductData();
        /*是否查询数据库*/
        boolean isQuerySql = false;
        /*1判断redis中是否有 集合数据*/
        if (stringRedisTemplate.hasKey(RedisKey.YLB_INDEX_PRODUCT)){
            /*2有直接从redis中获取*/
            System.out.println("redis获取");
            /*从redis中获取 json数据*/
            String json = stringRedisTemplate.boundValueOps(RedisKey.YLB_INDEX_PRODUCT).get();
            /*将json转换为 java对象*/
            try{
                 if (json!=null&&!"".equals(json)){
                     /*反序列化  将json数据 转换为  java 对象*/
                     productData = JSONObject.parseObject(json, ProductData.class);
                 }else {
                     isQuerySql = true;
                 }
            }catch (Exception e){
                /*解析失败  也要查询数据库*/
                isQuerySql=true;
            }

        }else {
            /*3 从数据库中获取*/
            isQuerySql=true;
        }
        if (isQuerySql){
            System.out.println("mysql中 获取");
            /*查询数据库*/
            /*从 mysql 中获取*/
            /*使用常量表示 产品类型*/
            /*三个属性赋值                            0开始 3个*/
            productData.setXinShouBao(
                    productInfoMapper.selectProductByType(YLBConstants.PRODUCT_TYPE_XINSHOUBAO,0,3));
            productData.setYouXuan(
                    productInfoMapper.selectProductByType(YLBConstants.PRODUCT_TYPE_YOUXUAN,0,3));
            productData.setSanBiao(
                    productInfoMapper.selectProductByType(YLBConstants.PRODUCT_TYPE_SANBIAO,0,3));
            /*4 将数据 存入 redis中*/
            /*将 java对象 序列化为 json数据 */
            String json = JSONObject.toJSONString(productData);
            /*将json存入 redis   过期时间为 2  小时*/
            stringRedisTemplate.boundValueOps(RedisKey.YLB_INDEX_PRODUCT).set(json,2, TimeUnit.HOURS);
        }
        return productData;
    }

    /**
     * 通过产品id 获取 产品数据
     * @param id
     * @return
     */
    @Override
    public ProductInfo queryById(Integer id) {
        /*省略  参数条件判断*/
        return productInfoMapper.selectByPrimaryKey(id);
    }
}
